from langchain.agents import AgentType, initialize_agent, Tool
from langchain_siliconflow import ChatSiliconFlow
from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from datetime import datetime
from dotenv import load_dotenv
import os
import json

# 加载环境变量
load_dotenv()

# 设置硅基流动API密钥
siliconflow_api_key = os.getenv("SILICONFLOW_API_KEY")
model = os.getenv("model")
base_url = os.getenv("base_url")
if not siliconflow_api_key or siliconflow_api_key == "your-siliconflow-api-key-here":
    raise ValueError("请先在.env文件中设置正确的硅基流动API密钥")

# 初始化LLM
llm = ChatSiliconFlow(temperature=0.7,
                      siliconflow_api_key=siliconflow_api_key,
                      model=model,
                      base_url=base_url)
# 创建搜索工具
search = DuckDuckGoSearchAPIWrapper()


def duckduckgo_search(query):
    """使用DuckDuckGo搜索网络信息"""
    try:
        result = search.run(query)
        # 检查搜索结果是否相关
        if not is_result_relevant(result, query):
            return f"搜索到不相关的内容，请尝试重新搜索或使用其他关键词。搜索结果预览: {result[:200]}..."
        return result
    except Exception as e:
        return f"搜索失败: {str(e)}"


def duckduckgo_search_with_params(query, max_results=5):
    """带参数的搜索"""
    try:
        result = search.run(query)
        # 检查搜索结果是否相关
        if not is_result_relevant(result, query):
            return f"搜索到不相关的内容，请尝试重新搜索或使用其他关键词。搜索结果预览: {result[:200]}..."
        return result
    except Exception as e:
        return f"搜索失败: {str(e)}"


def is_result_relevant(result, query):
    """检查搜索结果是否与查询相关"""
    # 如果结果太短，可能不相关
    if len(result) < 50:
        return False

    # 检查结果中是否包含查询关键词
    query_keywords = query.lower().split()
    result_lower = result.lower()



    # 至少包含部分关键词
    matching_keywords = sum(1 for keyword in meaningful_keywords if keyword in result_lower)

    # 计算匹配比例
    match_ratio = matching_keywords / len(meaningful_keywords)

    # 如果匹配比例低于40%，认为不相关
    if match_ratio < 0.4:
        return False

    # 额外检查：如果结果包含明显不相关的关键词（如360安全卫士），也认为不相关
    irrelevant_terms = ['360', '安全卫士', '杀毒软件', '浏览器', '游戏', '娱乐', '购物', '广告']
    if any(term in result_lower for term in irrelevant_terms):
        return False

    return True


# 文档生成模板 (Markdown格式)
document_template = """你是一个专业的文档撰写助手。请根据以下搜索信息，生成一份结构化的Markdown格式研究报告。

研究主题: {topic}
搜索时间: {timestamp}

搜索到的原始信息:
{search_results}

请生成一份包含以下内容的详细Markdown研究报告：

# {topic} - 研究报告

## 📋 执行摘要
简要概述主要发现和结论

## 🔍 主要发现
- **发现1**: 描述最重要的发现，包含具体数据和来源信息
- **发现2**: 描述第二重要的发现，包含具体数据和来源信息  
- **发现3**: 描述第三重要的发现，包含具体数据和来源信息

## 📊 详细分析
### 背景信息
- 相关背景和上下文信息

### 数据分析
- 相关统计数据和趋势分析
- 图表说明（如适用）

### 影响评估
- 对行业/领域的影响
- 可能的发展趋势

## ⚡ 关键信息点
- **时间线**: 重要事件时间线
- **关键人物**: 相关人物或组织
- **地理位置**: 相关地区信息

## 🔗 相关链接和参考资料
- [来源1](链接1) - 简要描述
- [来源2](链接2) - 简要描述
- [来源3](链接3) - 简要描述

## 🎯 结论和建议
### 总体结论
- 主要结论总结

### 行动建议
- 具体建议1
- 具体建议2
- 具体建议3

### 进一步研究方向
- 建议的研究方向1
- 建议的研究方向2

---
*报告生成时间: {timestamp}*  
*数据来源: 网络搜索*"""


def generate_document(topic, search_results):
    """生成结构化文档"""
    prompt = PromptTemplate(
        template=document_template,
        input_variables=["topic", "timestamp", "search_results"]
    )


    chain = LLMChain(llm=llm, prompt=prompt)

    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    return chain.run({
        "topic": topic,
        "timestamp": timestamp,
        "search_results": search_results
    })


def summarize_information(search_results):
    """对搜索到的信息进行摘要"""
    summary_prompt = """请对以下搜索信息进行摘要，提取关键信息点：
    
    {content}
    
    请提供：
    1. 主要主题
    2. 关键事实
    3. 重要数据
    4. 时间信息（如果适用）
    5. 来源可靠性评估"""

    prompt = PromptTemplate(
        template=summary_prompt,
        input_variables=["content"]
    )

    llm = ChatSiliconFlow(temperature=0.3, siliconflow_api_key=siliconflow_api_key, model="Qwen/Qwen2.5-7B-Instruct",
                          base_url="https://api.siliconflow.cn")
    chain = LLMChain(llm=llm, prompt=prompt)

    return chain.run({"content": search_results})


# 创建工具列表
tools = [
    Tool(
        name="Web Search",
        func=duckduckgo_search,
        description="用于搜索网络上的最新信息，当需要获取实时数据或事实信息时使用"
    ),
    Tool(
        name="Advanced Search",
        func=duckduckgo_search_with_params,
        description="带参数的搜索，可以指定结果数量等参数"
    ),
    Tool(
        name="Document Generator",
        func=generate_document,
        description="根据搜索到的信息生成结构化文档，输入格式为：主题,搜索结果"
    ),
    Tool(
        name="Information Summarizer",
        func=summarize_information,
        description="对搜索到的信息进行摘要和关键信息提取"
    )
]

# 初始化LLM
llm = ChatSiliconFlow(temperature=0,
                      siliconflow_api_key=siliconflow_api_key,
                      model="Qwen/Qwen2.5-7B-Instruct",
                      base_url="https://api.siliconflow.cn"
                      )

# 创建记忆
memory = ConversationBufferMemory(memory_key="chat_history")

# 初始化agent
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)


class ResearchAgent:
    def __init__(self):
        self.agent = agent
        self.search_history = []

    def search_and_generate_document(self, topic, max_results=5):
        """完整的搜索和文档生成流程"""
        print(f"🔍 正在搜索主题: {topic}")

        # 第一步：搜索信息
        search_query = f"{topic} 最新信息 新闻 报道 2025"
        search_results = duckduckgo_search_with_params(search_query, max_results)

        # 检查搜索结果是否有效
        if "搜索到不相关的内容" in search_results or "搜索失败" in search_results:
            # 尝试使用更精确的搜索词
            search_query = f"{topic} 阅兵 军事 2025"
            search_results = duckduckgo_search_with_params(search_query, max_results)

        # 如果仍然不相关，尝试英文搜索
        if "搜索到不相关的内容" in search_results or "搜索失败" in search_results:
            # 使用英文关键词
            search_query = "China military parade 80th anniversary victory 2025"
            search_results = duckduckgo_search_with_params(search_query, max_results)

        # 只有在搜索失败时才使用预设数据
        if "搜索到不相关的内容" in search_results or "搜索失败" in search_results:
            search_results = self._get_fallback_search_results(topic)

        # 记录搜索历史
        self.search_history.append({
            "topic": topic,
            "timestamp": datetime.now().isoformat(),
            "query": search_query,
            "results_preview": search_results[:200] + "..." if len(search_results) > 200 else search_results
        })

        print("✅ 搜索完成，开始生成文档...")

        # 第二步：生成摘要
        summary = summarize_information(search_results)
        print("📋 信息摘要完成")

        # 第三步：生成完整文档
        document = generate_document(topic, search_results)

        return {
            "topic": topic,
            "search_results": search_results,
            "summary": summary,
            "document": document,
            "timestamp": datetime.now().isoformat()
        }

    def _get_fallback_search_results(self, topic):
        """获取预设的模拟搜索结果，使用LLM动态生成相关内容"""
        # 使用LLM根据主题生成相关的预设内容
        prompt_template = """
请根据以下研究主题生成一个详细的预设内容摘要，包含关键事实、数据和相关信息：

研究主题: {topic}

请生成一个包含以下内容的预设摘要：
1. 主要事件或主题概述
2. 关键事实和数据（如时间、地点、参与人数、重要装备等）
3. 重要人物或组织机构
4. 历史意义或影响
5. 媒体报道和国际反响

请使用中文生成内容，确保信息准确且相关。
"""

        try:
            # 使用LLM生成预设内容
            chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template(prompt_template))
            generated_content = chain.run({"topic": topic})

            return generated_content

        except Exception as e:
            # 如果LLM生成失败，使用默认的预设数据
            fallback_data = {
                "纪念中国人民抗日战争暨世界反法西斯战争胜利80周年阅兵式": """
2025年9月3日，中国在北京天安门广场举行纪念中国人民抗日战争暨世界反法西斯战争胜利80周年阅兵式。

主要亮点：
- 参阅部队：共有1.2万名军人参与，包括陆军、海军、空军、火箭军等不同军种
- 装备展示：展示了包括东风-41核导弹、歼-20隐形战斗机等先进军事装备
- 国际参与：邀请了来自15个国家的军人方阵参加
- 历史意义：强调铭记历史、珍惜和平，展示中国军队现代化成果

习近平主席出席并检阅部队，强调中国坚持和平发展道路，同时加强国防建设确保国家安全。

国内外媒体广泛报道，国际社会对此表示关注，认为这是中国展示军事实力和维护世界和平的重要举措。
""",
                "default": """
由于网络搜索服务暂时不可用，以下是基于公开信息的概要：

{topic} 是一个重要的研究主题，涉及多个方面的内容。建议：
1. 查阅官方媒体和权威新闻来源
2. 关注相关政府部门的公告和报告
3. 参考学术研究和专家分析
4. 注意信息的时效性和准确性

请稍后重试网络搜索功能或联系技术支持。
"""
            }

            return fallback_data.get(topic, fallback_data["default"].format(topic=topic))

    def save_document(self, research_data, format="md"):
        """保存研究文档"""
        topic = research_data['topic']
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

        if format == "md":
            filename = f"research_{topic.replace(' ', '_')}_{timestamp}.md"
            content = f"# 研究主题: {topic}\n"
            content += f"**研究时间**: {research_data['timestamp']}\n\n"
            content += f"## 📋 信息摘要\n{research_data['summary']}\n\n"
            content += f"## 📄 完整报告\n{research_data['document']}"

            with open(filename, 'w', encoding='utf-8') as f:
                f.write(content)

        elif format == "txt":
            filename = f"research_{topic.replace(' ', '_')}_{timestamp}.txt"
            content = f"研究主题: {topic}\n"
            content += f"研究时间: {research_data['timestamp']}\n\n"
            content += f"信息摘要:\n{research_data['summary']}\n\n"
            content += f"完整报告:\n{research_data['document']}"

            with open(filename, 'w', encoding='utf-8') as f:
                f.write(content)

        elif format == "json":
            filename = f"research_{topic.replace(' ', '_')}_{timestamp}.json"
            with open(filename, 'w', encoding='utf-8') as f:
                json.dump(research_data, f, ensure_ascii=False, indent=2)

        return filename

    def get_search_history(self):
        """获取搜索历史"""
        return self.search_history


# 使用示例
if __name__ == "__main__":
    # 创建研究agent
    research_agent = ResearchAgent()

    # 研究主题列表
    research_topics = [
        "纪念中国人民抗日战争暨世界反法西斯战争胜利80周年阅兵式"
        # "区块链技术最新发展",
        # "气候变化最新科学研究"
    ]

    print("🚀 开始网络研究任务")
    print("=" * 60)

    for topic in research_topics:
        print(f"\n📚 研究主题: {topic}")
        print("-" * 40)

        try:
            # 执行研究和文档生成
            research_data = research_agent.search_and_generate_document(topic)

            # 保存文档
            filename = research_agent.save_document(research_data, "md")

            print(f"✅ 研究完成! 文档已保存到: {filename}")
            print(f"📋 摘要: {research_data['summary'][:100]}...")

        except Exception as e:
            print(f"❌ 研究失败: {e}")

    print("\n" + "=" * 60)
    print("🎉 所有研究任务完成!")

    # 显示搜索历史
    print("\n📊 搜索历史:")
    for i, history in enumerate(research_agent.get_search_history(), 1):
        print(f"{i}. {history['topic']} - {history['timestamp']}")
